/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Logistica.Controlador;


import CharliesCookies.MainController;
import com.dp1.pucp.Modelo.Clases.*;
import com.dp1.pucp.Logistica.DAO.*;
import com.dp1.pucp.Logistica.Vista.*;
import com.dp1.pucp.Seguridad.DAO.LogDAO;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author ubuntu64
 */
public class PedidoProduccionControlador {
    private TipoProductoDAO m;
    private PedidoProduccionGUI pedidoProduccionView;
    
    private BuscarSimulacionGUI buscarSimulacionView;
    private Tipoproducto producto;
    private Simulacion simulacion;
    //private Integer cantNormal;
    //private Integer cantDecora;
    //private Integer cantRellena;
    private ArrayList<Integer> lstCant=new ArrayList<>();
    private ArrayList<String> lstTipo;
    private ArrayList<String> lstUnidades;
    private MantPedidoProduccionControlador mantPedidoProduccionControlador;
    private final static int ESTADO_ACTIVO=1;
    private Boolean fin=true;
    private Boolean mostrar=true;

    
    public PedidoProduccionControlador(TipoProductoDAO dao, PedidoProduccionGUI view, MantPedidoProduccionControlador buc, Tipoproducto tipoproducto){
        m = dao;
        pedidoProduccionView = view;
        mantPedidoProduccionControlador = buc;
        llenarTipoCombo();
        llenarTipoUnidades();
        producto=tipoproducto;
        pedidoProduccionView.setFormUsuario(tipoproducto);
   
    }
    
    
    public PedidoProduccionControlador(TipoProductoDAO dao, PedidoProduccionGUI view, MantPedidoProduccionControlador buc){
        m = dao;
        pedidoProduccionView = view;
        mantPedidoProduccionControlador = buc;
        llenarTurnosAlternos();

            Date date= new Date();
            java.text.SimpleDateFormat simpleDateFormat=new java.text.SimpleDateFormat("dd/MM/yyyy");
            String StringDate=simpleDateFormat.format(date);
            pedidoProduccionView.setFecha(StringDate);

        pedidoProduccionView.addBuscarSListener(new buscarSimulacionListener(this));
        pedidoProduccionView.addBuscarPListener(new buscarProductoListener(this));
        pedidoProduccionView.addCancelarListener(new cancelarListener());             
        pedidoProduccionView.addGuardarListener(new guardarPedidoProduccionListener());
        
    }
    
    public PedidoProduccionControlador(TipoProductoDAO dao, PedidoProduccionGUI view, Tipoproducto tipoproducto,String codigoSimu){
        m = dao;
        pedidoProduccionView = view;

        producto=tipoproducto;
        //busco el productosimulacion
        Integer codSim=Integer.parseInt(codigoSimu);
        ArrayList<Productosimulacion> productosimulacion=m.listarProductoSimulacion(codSim,producto);
        
        pedidoProduccionView.setFormUsuarioPF(producto,productosimulacion.get(0));

    }
    
   public PedidoProduccionControlador(TipoProductoDAO dao, PedidoProduccionGUI view, Simulacion simu){
        m = dao;
        pedidoProduccionView = view;

        simulacion=simu;
        
        if(simulacion.getCantnormal()!=0)
        //cantNormal=simulacion.getCantnormal();
            lstCant.add(simulacion.getCantnormal());
            
        if(simulacion.getCantdecorada()!=0)
        //cantDecora=simulacion.getCantdecorada();
            lstCant.add(simulacion.getCantdecorada());
            
            
        if(simulacion.getCantrellena()!=0)
        //cantRellena=simulacion.getCantrellena();
            lstCant.add(simulacion.getCantrellena());
            
        pedidoProduccionView.setFormUsuarioSimu(simu);
        pedidoProduccionView.addCancelarListener(new cancelarListener());             
        pedidoProduccionView.addGuardarListener(new guardarPedidoProduccionListener());
        
    }
    
    private void llenarTipoCombo(){
        lstTipo = m.listarTipo();
        pedidoProduccionView.llenaComboEstado(lstTipo);
    }
    
    private void llenarTurnos(){
        lstTipo = m.listarTurno();
        pedidoProduccionView.llenaComboEstado(lstTipo);
    }
    
    private void llenarTurnosAlternos(){
        lstTipo = m.listarTurnoAlterno();
        pedidoProduccionView.llenaComboEstado(lstTipo);
    }
    
    private void llenarTipoUnidades(){
        lstUnidades = m.listarUnidades();
        pedidoProduccionView.llenaComboUnidades(lstUnidades);
    }
    
    class buscarProductoListener implements ActionListener{
        
        private PedidoProduccionControlador buc;
        public buscarProductoListener(PedidoProduccionControlador buscarusr){
            buc=buscarusr;
        }
              
        @Override
        public void actionPerformed(ActionEvent e) {
            String codSimulacion=pedidoProduccionView.getSimulacion();
            int idSimulacion=Integer.parseInt(codSimulacion);
            
            BuscarProductoGUI p = new BuscarProductoGUI(pedidoProduccionView.getPadre(), true);
            BuscarProductoControlador d = new BuscarProductoControlador(m,p,pedidoProduccionView,idSimulacion);
            p.setVisible(true);
        }      
    }
    
    class buscarSimulacionListener implements ActionListener{
        
        private PedidoProduccionControlador buc;
        public buscarSimulacionListener(PedidoProduccionControlador buscarusr){
            buc=buscarusr;
        }
              
        @Override
        public void actionPerformed(ActionEvent e) {
            BuscarSimulacionGUI p = new BuscarSimulacionGUI(pedidoProduccionView.getPadre(), true);
            BuscarSimulacionControlador d = new BuscarSimulacionControlador(m,p,pedidoProduccionView);
            p.setVisible(true);
        }      
    }
    
    
        
    class guardarPedidoProduccionListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            Pedidoproduccion a = new Pedidoproduccion();
            int prueba=0;
            
            Tipoproducto p=new Tipoproducto();
            p.setIdtipoproducto(Integer.parseInt(pedidoProduccionView.getCodProd()));
            
            a.setFecha(new Date());
            a.setCantidadCubierta(Float.parseFloat(String.valueOf(0)));
            a.setCantidad(Float.parseFloat(pedidoProduccionView.getCantidad()));
            a.setEstado(ESTADO_ACTIVO);
            a.setSimulacion(simulacion);
            a.setTipoproducto(p);
            a.setTurno(pedidoProduccionView.getTurno()+1);

            //verificamos si hay materia prima en almacen
            
            //se halla la receta necesaria para ese producto
            Float cantidad=Float.parseFloat(pedidoProduccionView.getCantidad());
            
            ArrayList<Long> politicas=new ArrayList<Long>();
            ArrayList<Integer> stock=new ArrayList<Integer>();
            ArrayList<RecetaPfMp> receta=m.listarReceta(p.getIdtipoproducto());
            ArrayList<Integer> codMaterias=new ArrayList<Integer>();
            int i;
            
            for(i=0;i<receta.size();i++){
                
                Integer codMP=receta.get(i).getTipoproductoByIdtipoproductoMp().getIdtipoproducto();
                codMaterias.add(codMP);//tengo el listado de todos los codigos de cada una de las MP de la receta
                Float cantidRece=receta.get(i).getCantidad();
                receta.get(i).setCantidad(cantidad*cantidRece);
            }
            //se setea la cantidad en el mismo arreglo
            
            //saco la cantidad que hay de esa materia prima en el almacen de materia prima !
            for (i=0;i<receta.size();i++){
            ArrayList<Materiaprima> materiaPrima=m.listarMateriaPrima(receta.get(i).getTipoproductoByIdtipoproductoMp().getIdtipoproducto());

            //total de esa MP que se tiene en el almacen
            Integer cantStockMP=materiaPrima.get(0).getCantidad();
            Long minPolitica=materiaPrima.get(0).getTipoproducto().getMinPolitica();
            
            //}

                politicas.add(minPolitica);//voy agregando en un arreglo las minimas politicas de cada MP
                stock.add(cantStockMP);
            }

            //analizar cada una de las MP para esa receta de tal producto

                    //Genero un pedidoProduccion
                    //mando pedidoCompra ccon nombre "charlie cookie" y movito "Politicas"
                    Pedidocompra pedCompra=new Pedidocompra();
                    
                    pedCompra.setFechasolicitud(new Date());
                    pedCompra.setMotivo("Politicas");
                    pedCompra.setCodigo("PED");
                    pedCompra.setNumordcomprafinalizadas(0);
                    pedCompra.setNumordcompratotal(0);
                    pedCompra.setEstado(1);//registrada

//            for(i=0;i<receta.size();i++){
//                
//                //comparo cantidad que necesito con lo que tengo en stock
//                //para cada uno de mis materias primas hago esta comparacion
//                
//                if ( (stock.get(i)-receta.get(i).getCantidad())> politicas.get(i)){
//                  //si entra es pork se cumple con el min politica, es decir
//                  //que me queda mucho mas del min Politica 
//                    
//                    //directamente se saca la materia prima necesaria del almacen
//                    
//                    ArrayList<Materiaprima> matPrima=m.listarMateriaPrima(receta.get(i).getTipoproductoByIdtipoproductoMp().getIdtipoproducto());
//                    
//                    Integer codMatPrima=matPrima.get(0).getIdmateriaprima();
//                    ArrayList<Materiaprima> antiguaMatPrima=m.listarMateriaPrima(receta.get(i).getTipoproductoByIdtipoproductoMp().getIdtipoproducto());
//                    Materiaprima antMatPrima=antiguaMatPrima.get(0);
//                    
//                    Materiaprima nuevaMatPrima=new Materiaprima();
//                    nuevaMatPrima.setCodigo(antMatPrima.getCodigo());
//                    nuevaMatPrima.setEstado(antMatPrima.getEstado());
//                    nuevaMatPrima.setVolumen(antMatPrima.getVolumen());
//                    nuevaMatPrima.setLote(antMatPrima.getLote());
//                    nuevaMatPrima.setFechaCaducidad(antMatPrima.getFechaCaducidad());
//                    nuevaMatPrima.setTipoproducto(antMatPrima.getTipoproducto());
//                    nuevaMatPrima.setAlmacen(antMatPrima.getAlmacen());
//                    
//                    nuevaMatPrima.setIdmateriaprima(codMatPrima);
//                    
//                    //seteo la cantidad
//                    Float nuevaCantidad=stock.get(i)-receta.get(i).getCantidad();
//                    String nueva=String.valueOf(nuevaCantidad);
//                    int car=nueva.indexOf(".");
//                    String finCantidad=nueva.substring(0, car);
//                    
//                    Integer cant=Integer.parseInt(finCantidad);
//                    
//                    nuevaMatPrima.setCantidad(cant);
//                    
//                    m.guardarMP(nuevaMatPrima); 
//                    
//                }
//                else{
//                //sino es porque se necesita mas de lo que hay en almacen, necesito stock
//                    ///10000                12000
//                //si es el caso
//                //se manda pedido compra con cantidad= receta.get(i).getCantidad()-stock.get(i)
//                //y otro para cumplir politicas de stock con nombre ....    
//                
//                   //creo las lineas de pedido compra
//                    
//                    Float canti= politicas.get(i)-(stock.get(i)-receta.get(i).getCantidad());
//                    
//                    //if(canti>0){
//                        
//                    Lineapedidocompra linPedCompra= new Lineapedidocompra();
//                    
//                    linPedCompra.setCantidad(canti);
//                    linPedCompra.setPedidocompra(pedCompra);
//                    linPedCompra.setTipoproducto(receta.get(i).getTipoproductoByIdtipoproductoMp());
//                    
//                    if (linPedCompra!=null && fin){
//                        m.guardarPedido(pedCompra);
//                        fin=false;
//                                
//                    }
//                    
//                    m.guardarLineaPedido(linPedCompra);
//                    
//                    //}
//  
//                    //saco MP del almacen
//                    ArrayList<Materiaprima> matPrima=m.listarMateriaPrima(receta.get(i).getTipoproductoByIdtipoproductoMp().getIdtipoproducto());
//                    Integer codMatPrima=matPrima.get(0).getIdmateriaprima();
//                    
//                    //Materiaprima nuevaMatPrima=new Materiaprima();
//                    
//                    
//                    ArrayList<Materiaprima> antiguaMatPrima=m.listarMateriaPrima(receta.get(i).getTipoproductoByIdtipoproductoMp().getIdtipoproducto());
//                    Materiaprima antMatPrima=antiguaMatPrima.get(0);
//                    
//                    Materiaprima nuevaMatPrima=new Materiaprima();
//                    
//                    nuevaMatPrima.setIdmateriaprima(codMatPrima);
//                    
//                    nuevaMatPrima.setCodigo(antMatPrima.getCodigo());
//                    nuevaMatPrima.setEstado(antMatPrima.getEstado());
//                    nuevaMatPrima.setVolumen(antMatPrima.getVolumen());
//                    nuevaMatPrima.setLote(antMatPrima.getLote());
//                    nuevaMatPrima.setFechaCaducidad(antMatPrima.getFechaCaducidad());
//                    nuevaMatPrima.setTipoproducto(antMatPrima.getTipoproducto());
//                    nuevaMatPrima.setAlmacen(antMatPrima.getAlmacen());
//                    
//                    //ACA FALLA CUANDO TENGO 1000 y necesito 245000 
//                    //la nueva cantidad sale negativa
//                    //seteo la cantidad
//                    Float nuevaCantidad=stock.get(i)-receta.get(i).getCantidad();
//                    String nueva=String.valueOf(nuevaCantidad);
//                    int carac=nueva.indexOf(".");
//                    String finalCantidad=nueva.substring(0, carac);
//
//                    Integer ca=Integer.parseInt(finalCantidad);
//                    
//                    nuevaMatPrima.setCantidad(ca);
//                    
//                    m.guardarMP(nuevaMatPrima); 
//                
//                }
//
//            }
            
            //Aca quito la materia prima del almacen
            //hallo cantidad de galletas (unidades) del producto entrante
            
            //float cantidadGalleta=a.getCantidad();
            
            //saco receta de esa galleta
//            Integer recetaX=0;
//            if(a.getTipoproducto().getIdtipoproducto()==9)
//                recetaX=1;
//            if(a.getTipoproducto().getIdtipoproducto()==10)
//                recetaX=2;
//            if(a.getTipoproducto().getIdtipoproducto()==11)
//                recetaX=3;
            
            
            //ArrayList<RecetaPfMp> recetaGalleta=m.listarReceta(recetaX);
            
//            for(i=0;i<recetaGalleta.size();i++){
//                //por cada materia prima saco la cantidad por unidad de galleta
//                float cantUnidad=recetaGalleta.get(i).getCantidad();
//                
//                //hallo cantidad total de esa materia prima
//                float cantTotal=cantUnidad*cantidadGalleta;
//                
//                //quito para esa materia prima la cantidad total
//                //saco cantidad que hay en almacen de esa materia prima
//                ArrayList<Materiaprima> materiaP=m.listarMateriaPrima(recetaGalleta.get(i).getTipoproductoByIdtipoproductoMp().getIdtipoproducto());
//                float cantAlmacen=materiaP.get(0).getCantidad();
//                
//                float cantRestante=cantAlmacen-cantTotal;
//                int cantR=(int)cantRestante;
//                //actualizamos cantidad en el almacen
//                Materiaprima nuevoMP=new Materiaprima();
//                
//                nuevoMP.setIdmateriaprima(materiaP.get(i).getIdmateriaprima());
//                nuevoMP.setAlmacen(materiaP.get(i).getAlmacen());
//                nuevoMP.setCantidad(cantR);
//                nuevoMP.setCodigo(materiaP.get(i).getCodigo());
//                nuevoMP.setEstado(materiaP.get(i).getEstado());
//                nuevoMP.setFechaCaducidad(materiaP.get(i).getFechaCaducidad());
//                nuevoMP.setLote(materiaP.get(i).getLote());
//                nuevoMP.setTipoproducto(materiaP.get(i).getTipoproducto());
//                nuevoMP.setVolumen(materiaP.get(i).getVolumen());
//
//                //se guarda en kardex 
//                
//                Kardex kardex=new Kardex();
//                long cant=(long)cantTotal;
//                
//                kardex.setAlmacen(nuevoMP.getAlmacen());
//                kardex.setCantidad(cant);
//                kardex.setEntradasalida('S');
//               
//                
//                Date date= new Date();
//                SimpleDateFormat simpleDateFormat=new SimpleDateFormat("dd/MM/yyyy");
//                String StringFecha=simpleDateFormat.format(date);
//        
//                DateFormat hourFormat = new SimpleDateFormat("HH:mm:ss");
//                String StringHour=hourFormat.format(date);
//                
//                SimpleDateFormat formatoF = new SimpleDateFormat("dd/MM/yyyy");
//                String strFechaF = StringFecha;
//                Date fechaDateF = null;
//                try {
//                fechaDateF = formatoF.parse(strFechaF);
//                        //System.out.println(fechaDate.toString());
//                //return fechaDate;
//                } catch (ParseException ex) {
//                    ex.printStackTrace();
//                //return fechaDate;
//                }
//                
//                SimpleDateFormat formatoH = new SimpleDateFormat("HH:mm:ss");
//                String strFechaH = StringHour;
//                Date fechaDateH = null;
//                try {
//                fechaDateH = formatoH.parse(strFechaH);
//                } catch (ParseException ex) {
//                    ex.printStackTrace();
//                }
//                
//                
//                kardex.setFecha(fechaDateF);
//                kardex.setHora(fechaDateH);
//                kardex.setMotivo("Salida Insumo");
//                kardex.setTipo("MP");
//                kardex.setTipoproducto(nuevoMP.getTipoproducto());
//                
//                
//                
//                //m.guardarMP(nuevoMP);
//                //para que no se agreguen dobles busco el penultimo
//                Kardex kardexPenultimo=m.sacarPenultimoKardex();
//                Kardex kardexUltimo=m.sacarUltimoKardex();
//                
//                //El nuevo k va a ingresar tiene k ser diferente del penultimo
//                
//                if(kardexPenultimo.getTipoproducto().getIdtipoproducto()==kardex.getTipoproducto().getIdtipoproducto() && kardexPenultimo.getCantidad().equals(kardex.getCantidad())){
//                    //     no agrega, no hace nada
//                    prueba++;
//                }
//                else{
//                    if(kardexUltimo.getTipoproducto().getIdtipoproducto()==kardex.getTipoproducto().getIdtipoproducto() && kardexUltimo.getCantidad().equals(kardex.getCantidad())){
//                        prueba++;
//                    }
//                    else{
//                    m.guardarAjuste(kardex);
//                    }
//                }
//
//            }

            
            m.guardarPedidoProduccion(a);
            LogDAO.insertarLog(MainController.usuario, "Agregar Pedido de Produccion");

            //sacar toda la simulacion
            
            //inicialmente le pongo estado 3 .....
            Simulacion u=simulacion;
            //saco el idTipoProducto del pedidoSimulacion que genere
            //para setear esa cantidad con 0
            
            int codProducto=a.getTipoproducto().getIdtipoproducto();
            if(codProducto==9 && u.getCantnormal()!=0){
                //cantNormal=simulacion.getCantnormal();
                //esto es para cantidad normal
                u.setCantnormal(0);
            }
            if(codProducto==10 && u.getCantdecorada()!=0){
                //cantDecora=simulacion.getCantdecorada();
                u.setCantdecorada(0);
            }
            if(codProducto==11 && u.getCantrellena()!=0){
                //cantRellena=simulacion.getCantrellena();
                u.setCantrellena(0);
            }
 
            //no se porque seteo a 3
            //u.setEstado(3);
            //Integer cant=cantNormal;
            if(u.getCantrellena()==0 && u.getCantnormal()==0 && u.getCantdecorada()==00){
                u.setEstado(5);//aca pasa la simulacion a disponible...
                //u.setCantnormal(cantNormal);
                //u.setCantdecorada(cantDecora);
                //u.setCantrellena(cantRellena);
                ArrayList<Demanda> demanda=m.listarDemanda(simulacion.getIdsimulacion());
                Demanda dem=demanda.get(0);
                
                u.setCantnormal(dem.getCantPedNormal());
                u.setCantdecorada(dem.getCantPedDec());
                u.setCantrellena(dem.getCantPedRell());
                
            }
            
            

            m.guardarSimulacion(u);

            if(mostrar){
                pedidoProduccionView.mostrarAviso("Se guardo exitosamente el pedido de produccion");
                mostrar=false;
            }
            pedidoProduccionView.dispose();
                        
        }
    }
    
    class cancelarListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            LogDAO.insertarLog(MainController.usuario, "Salir Agregar Pedido de Produccion");
            pedidoProduccionView.dispose();
        }        
    }    
}
